package com.example.controller;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.example.Util.DbUtil;
import com.example.Util.JsonUtil;
import com.example.Util.ResponseUtil;
import com.example.dao.ClassDao;
import com.example.dao.StudentDao;
import com.example.entity.ClassInfo;
import com.example.model.PageBean;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;

/*
* class/classList   查询get
* class/updateClass   修改post
* class/deleteClass   删除delete/post
* class/insertClass   新增post
* */
@WebServlet("/class/*")
public class ClassServlet extends HttpServlet {
    DbUtil dbUtil=new DbUtil();
    ClassDao classDao=new ClassDao();
    /*
    * ctrl+o   重写方法
    * ctrl+i   当类有实现关系时快速实现抽象接口
    * */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //ctrl+y   删除当前行
        //前端发过来一个class/classList请求时 实际需要获取到classList路径
        String requestURI=req.getRequestURI();
        System.out.println(requestURI);
        //获取最后一个‘/’的下标位置
        int lastindexof=requestURI.lastIndexOf("/");
        //查询参数标志，存在返回实际下表，不存在返回-1
        int queryFlag=requestURI.indexOf("?");
        if(queryFlag!=-1){
            //截取查询参数
            requestURI=requestURI.substring(lastindexof+1,queryFlag);
        }else{
            //截取到最后
            requestURI=requestURI.substring(lastindexof+1);
        }
        System.out.println(requestURI);

        //根据requestURI来执行对应的操作
        switch (requestURI){
            //匹配业务查询
            case "classList":
                getClassList(req, resp);
                break;
            //新增班级
            case "classSave":
                insertClass(req, resp);
                break;
            //删除
            /*
            * 参数delIds
            * */
            case "classDelete":
                try {
                    deleteClass(req, resp);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                break;
            case "insertClass":
                //新增classList
                break;
            default:
                System.out.println("未找到匹配的业务请求");
        }
    }

    private void getClassList(HttpServletRequest req, HttpServletResponse resp) {
        /*
         * 1、获取查询参数  page 当前页   rows 每页多少条数据
         * 2、封装查询实体  把参数封装到实体给到dao持久层做条件/分页查询
         * 3、查询
         * */
        String page= req.getParameter("page");
        String rows= req.getParameter("rows");
        PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
        Connection con=null;
        try {
            con=dbUtil.getCon();
            String className= req.getParameter("className");
            String classDesc= req.getParameter("classDesc");
            //封装
            ClassInfo classInfo =new ClassInfo();
            classInfo.setClassName(className);
            classInfo.setClassDesc(classDesc);

            //数据库查询
            ResultSet resultSet =classDao.getClassList(con, pageBean,classInfo);
            //封装结果集  封装好实际数据
            JSONArray jsonArray=JsonUtil.formatRsToJsonArray(resultSet);
            //告知前端有多少条数据
            int total= classDao.count(con,classInfo);
            //返回页面
            JSONObject result = new JSONObject();
            result.put("total", total);
            result.put("rows", jsonArray);

            resp.setContentType("application/json;charset=utf-8");
            resp.getWriter().write(jsonArray.toJSONString());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closeCon(con);
        }
    }

    private void  insertClass(HttpServletRequest req,HttpServletResponse resp){
        //1、接收请求发过来的参数
        String className = req.getParameter("className");
        String classDesc = req.getParameter("classDesc");
        //2、目前这个新增接口  需要承载两个功能  新增、修改
        String classId=req.getParameter("id");
        ClassInfo classInfo = new ClassInfo();
        classInfo.setClassName(className);
        classInfo.setClassDesc(classDesc);
        //获取数据库连接
        Connection con=null;
        try {
            con=dbUtil.getCon();
            int saveNum=0;
            JSONObject result=new JSONObject();
            //3、执行新增/修改操作
            if(classId==null){
                //需要新增班级信息
               saveNum=classDao.insertClass(con,classInfo);
            }else{
                classInfo.setId(Integer.parseInt(classId));
                //需要修改班级信息
                saveNum=classDao.updateClass(con,classInfo);
            }
            //执行的结果如果大于0，插入了数据或者修改了数据，就说明新增成功
            if(saveNum>0){
                result.put("success",true);
            }else{
                result.put("success",true);
                result.put("errorMsg","新增数据失败");
            }
            ResponseUtil.write(resp,result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closeCon(con);
        }

    }

    private void deleteClass(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        //1、支持批量删除，利用分隔符  分割参数为数组
        StudentDao studentDao = new StudentDao();
        String delIds=req.getParameter("delIds");
        JSONObject result = new JSONObject();
        if(delIds==null){
            result.put("success",false);
            result.put("errorMsg","删除学生ID不能为空");
            ResponseUtil.write(resp,result);
            return;
        }
        //2、删除班级的时候  需要检查班级是否已经分配了学生     没有学生--安全删除   有学生--不可删除
        Connection con=null;
        try {
            con=dbUtil.getCon();
            String[] ids=delIds.split(",");//通过逗号分割字符串
            //拿到班级信息去查询学生表的班级
            for (String id : ids) {

                boolean flag=studentDao.getStudentByClassId(con,id);
                if(flag){
                    result.put("success",false);
                    result.put("errorMsg","存在学生的班级，无法删除");
                    ResponseUtil.write(resp,result);
                    return;
                }
            }
            //没有学生
            //由于SQL底层使用IN语句删除，数据格式前端组装好了，直接传入
            int delNums=classDao.deleteClass(con,delIds);
            //执行的结果如果大于0，就说明删除了数据，就说明删除成功
            if(delNums>0){
                result.put("success",true);
                result.put("delNums",delNums);
            }else{
                result.put("success",false);
                result.put("errorMsg","删除数据失败");
            }
            //3、返回信息给前端，通知前端删除结果
            ResponseUtil.write(resp,result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closeCon(con);
        }



    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
